package com.lk.dao;

import com.lk.utils.DButils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/*
基础jdbc类
更新操作(增删改)
查询操作
 */
public class BaseDao {
    //更新(增删改)
    public static int executeUpdate(String sql, List<Object> params){
        int row=0;
        Connection conn=null;
        PreparedStatement ps=null;
        try {
            conn=DButils.getConn();
            ps=conn.prepareStatement(sql);
            if(params!=null&&params.size()>0){ //若存在参数
                for (int i = 0; i < params.size(); i++) {
                    ps.setObject(i+1,params.get(i));
                }
            }
            row=ps.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DButils.close(null,ps,conn);
        }
        return row;
    }

    //查询一个字段
    public static Object findSingleValue(String sql,List<Object> params){
        Object obj=null;
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            conn=DButils.getConn();
            ps=conn.prepareStatement(sql);
            if(params!=null&&params.size()>0){ //若存在参数
                for (int i = 0; i < params.size(); i++) {
                    ps.setObject(i+1,params.get(i));
                }
            }
            rs=ps.executeQuery();
            if(rs.next()){
                obj=rs.getObject("1");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DButils.close(rs,ps,conn);
        }
        return obj;
    }

    //查询集合  通过反射创建对象
    public static List queryRows(String sql,List<Object> params,Class cls){
        List list=new ArrayList();
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            conn=DButils.getConn();
            ps=conn.prepareStatement(sql);
            if(params!=null&&params.size()>0){ //若存在参数
                for (int i = 0; i < params.size(); i++) {
                    ps.setObject(i+1,params.get(i));
                }
            }
            rs=ps.executeQuery();
            //获取结果集的元数据对象(可以获取字段的数量以及名称)
            ResultSetMetaData resultSetMetaData=rs.getMetaData();
            //数量
            int fieldNum=resultSetMetaData.getColumnCount();
            while (rs.next()){
                Object obj=cls.newInstance();
                for (int i = 1; i <=fieldNum ; i++) {
                    String columnName=resultSetMetaData.getColumnLabel(i);
                    Field field=cls.getDeclaredField(columnName);
                    String setMethod="set"+columnName.substring(0,1).toUpperCase()+columnName.substring(1);
                    Method method=cls.getDeclaredMethod(setMethod,field.getType());
                    Object value=rs.getObject(columnName);
                    method.invoke(obj,value);
                }
                list.add(obj);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DButils.close(rs,ps,conn);
        }
        return list;
    }

    //查询某个对象
    public static Object queryRow(String sql,List<Object> params,Class cls){
        List list=queryRows(sql,params,cls);
        Object obj=null;
        if(list!=null && list.size()>0){
            obj=list.get(0);
        }
        return obj;
    }
}

